package colecciones.tests;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;

import org.junit.Before;
import org.junit.Test;

import colecciones.colecciones.MiColeccion;


public class ColectionBasicsTest {
	private MiColeccion<String> miColeccion;

	@Before
	public void before() {
		this.miColeccion=new MiColeccion<String>();
	}
	
	@Test
	public void sePuedeIterarUnaColeccion() {
		this.miColeccion.add("hola").add("como").add("te").add("va");
		String todoJunto="";
		
		for(String palabra : this.miColeccion) {
			todoJunto += palabra;
		}
		
		assertEquals("Se puede iterar la colecci�n", "holacomoteva", todoJunto);
	}
	
	@Test
	public void testAdd() {
		this.miColeccion.add("1");
		assertEquals("El elemento debe ser el n�mero 1.", "1", this.miColeccion.get(0));
	}
	
	@Test
	public void testAddAll() {
		ArrayList<String> elementos=new ArrayList<String>();
		elementos.add("hola");
		elementos.add("chau");
		this.miColeccion.addAll(elementos);
		
		assertEquals("El primer elemento debe ser el String hola", "hola", this.miColeccion.get(0));
		assertEquals("El segundo elemento debe ser el String chau", "chau", this.miColeccion.get(1));
	}
	
	@Test
	public void testUnaColeccionEstaVacia() {
		assertTrue("La colecci�n debe estar vac�a", this.miColeccion.isEmpty());
	}
	
	@Test
	public void testUnaColeccionNoEstaVacia() {
		this.miColeccion.add("1");
		assertFalse("La colecci�n debe NO estar vac�a", this.miColeccion.isEmpty());
	}
	
	@Test
	public void testSize() {
		this.miColeccion.add("1");
		this.miColeccion.add("1");
		this.miColeccion.add("1");
		assertEquals("La colecci�n debe tener 3 elementos", 3, this.miColeccion.size());
	}
	
	@Test
	public void testRemove() {
		ArrayList<String> elementos=new ArrayList<String>();
		elementos.add("hola");
		elementos.add("chau");
		this.miColeccion.addAll(elementos).remove("hola");
		
		assertEquals("El primer elemento debe ser el String chau", "chau", this.miColeccion.get(0));
	}
	
	@Test
	public void testRemoveAll() {
		ArrayList<String> elementosAAgregar=new ArrayList<String>();
		elementosAAgregar.add("hola");
		elementosAAgregar.add("chau");
		elementosAAgregar.add("como");
		elementosAAgregar.add("te va");
		
		ArrayList<String> elementosAQuitar=new ArrayList<String>();
		elementosAQuitar.add("como");
		elementosAQuitar.add("hola");
		
		this.miColeccion.addAll(elementosAAgregar).removeAll(elementosAQuitar);
		assertEquals("El primer elemento debe ser el String chau", "chau", this.miColeccion.get(0));
		assertEquals("El segundo elemento debe ser el String te va", "te va", this.miColeccion.get(1));
	}
	
	@Test
	public void testIncludes() {
		MiColeccion<String> unaColeccion = new MiColeccion<String>()
		.add("Se")
		.add("ve")
		.add("se")
		.add("siente")
		.add("el")
		.add("pueblo")
		.add("est�")
		.add("presente");
		assertTrue("El elemento est� presente en la colecci�n", unaColeccion.includes("presente"));
	}
	
	@Test
	public void testIncludesAll() {
		MiColeccion<String> unaColeccion = new MiColeccion<String>()
			.add("Se")
			.add("ve")
			.add("se")
			.add("siente")
			.add("el")
			.add("pueblo")
			.add("est�")
			.add("presente");
		ArrayList<String> elementos=new ArrayList<String>();
		elementos.add("presente");
		elementos.add("pueblo");
		assertTrue("El elemento est� presente en la colecci�n", unaColeccion.includesAll(elementos));
	}
	
	@Test
	public void testNoIncludes() {
		MiColeccion<String> unaColeccion = new MiColeccion<String>()
		.add("Se")
		.add("ve")
		.add("se")
		.add("siente")
		.add("el")
		.add("pueblo")
		.add("est�")
		.add("presente");
		assertFalse("El elemento est� ausente en la colecci�n", unaColeccion.includes("ausente"));
	}
	
	@Test
	public void testNoIncludesAll() {
		MiColeccion<String> unaColeccion = new MiColeccion<String>()
			.add("Se")
			.add("ve")
			.add("se")
			.add("siente")
			.add("el")
			.add("pueblo")
			.add("est�")
			.add("presente");
		ArrayList<String> elementos=new ArrayList<String>();
		elementos.add("ausente");
		elementos.add("pueblo");
		assertFalse("El elemento est� ausente en la colecci�n", unaColeccion.includesAll(elementos));
	}
}
